/**
 * CEP Mobile Manager on Android July 2012 
 */
package com.orange.cepmanager.android;


import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import com.google.android.gcm.GCMBaseIntentService;
import com.google.android.gcm.GCMRegistrar;
import static com.orange.cepmanager.android.CEPManagerCommon.*;
import com.orange.cepmanager.android.R;
import com.orange.cepmanager.android.activity.CEPMobileManager;
import com.orange.cepmanager.android.gcm.GCMMessageCommand;
import com.orange.cepmanager.android.gcm.GCMServer;
import com.orange.cepmanager.android.rest.CEPManagerREST;

/**
 * IntentService responsible for handling GCM messages.
 * 
 * @author FAIROUZ OUBENALI
 *
 */
public class GCMIntentService extends GCMBaseIntentService {

	@SuppressWarnings("hiding")
	public GCMIntentService() {
		super(SENDER_ID);
	}

	/* (non-Javadoc)
	 * @see com.google.android.gcm.GCMBaseIntentService#onRegistered(android.content.Context, java.lang.String)
	 */
	@Override
	protected void onRegistered(Context context, String registrationId) {
		Log.i(TAG, "Device registered: regId = " + registrationId);
		//afficher des msg test
		displayMessage(context, getString(R.string.gcm_registered));
		CEPManagerREST.registerOnAppEngine(context,registrationId);
	}

	/* (non-Javadoc)
	 * @see com.google.android.gcm.GCMBaseIntentService#onUnregistered(android.content.Context, java.lang.String)
	 */
	@Override
	protected void onUnregistered(Context context, String registrationId) {
		Log.i(TAG, "Device unregistered " + registrationId);
		displayMessage(context, getString(R.string.gcm_unregistered));
		displayMessage(context, "onUnregistered ");
		if (GCMRegistrar.isRegisteredOnServer(context)) {
			GCMServer.unregister(context, registrationId);
		} else {
			// This callback results from the call to unregister made on
			// ServerUtilities when the registration to the server failed.
			Log.i(TAG, "Ignoring unregister callback");
		}
	}

	/* (non-Javadoc)
	 * @see com.google.android.gcm.GCMBaseIntentService#onMessage(android.content.Context, android.content.Intent)
	 */
	@Override
	protected void onMessage(Context context, Intent intent) {
		Log.i(TAG, "Received message");

		final String data = intent.getStringExtra("data");
		Log.i(GCM_INTENT_SERVICE_TAG, " message received " + data);
		String message = getString(R.string.gcm_message);
		if (data.contains(CommandCEP.message.toString())) {
			// notifies user
			generateNotification(context, message);
		} else if (data.contains(CommandCEP.startCEPEngine.toString())) {
			GCMMessageCommand gcmCommandCEP = new GCMMessageCommand(context,
					CommandCEP.startCEPEngine);
			gcmCommandCEP.executeCommandCEP();
		} else if (data.contains(CommandCEP.stopCEPEngine.toString())) {
			GCMMessageCommand gcmCommandCEP = new GCMMessageCommand(context,
					CommandCEP.stopCEPEngine);
			gcmCommandCEP.executeCommandCEP();
		}
		displayMessage(context, message + " command :" + data);

	}

	/* (non-Javadoc)
	 * @see com.google.android.gcm.GCMBaseIntentService#onDeletedMessages(android.content.Context, int)
	 */
	@Override
	protected void onDeletedMessages(Context context, int total) {
		Log.i(TAG, "Received deleted messages notification");
		String message = getString(R.string.gcm_deleted, total);
		displayMessage(context, message);
		// notifies user
		generateNotification(context, message);
	}

	/* (non-Javadoc)
	 * @see com.google.android.gcm.GCMBaseIntentService#onError(android.content.Context, java.lang.String)
	 */
	@Override
	public void onError(Context context, String errorId) {
		Log.i(TAG, "Received error: " + errorId);
		// displayMessage(context, getString(R.string.gcm_error, errorId));
	}

	/* (non-Javadoc)
	 * @see com.google.android.gcm.GCMBaseIntentService#onRecoverableError(android.content.Context, java.lang.String)
	 */
	@Override
	protected boolean onRecoverableError(Context context, String errorId) {
		// log message
		Log.i(TAG, "Received recoverable error: " + errorId);
		displayMessage(context,
				getString(R.string.gcm_recoverable_error, errorId));
		return super.onRecoverableError(context, errorId);
	}

	/**
	 * Issues a notification to inform the user that server has sent a message.
	 * @param context
	 * @param message
	 */
	private static void generateNotification(Context context, String message) {
		int icon = R.drawable.ic_stat_gcm;
		long when = System.currentTimeMillis();
		NotificationManager notificationManager = (NotificationManager) context
				.getSystemService(Context.NOTIFICATION_SERVICE);
		Notification notification = new Notification(icon, message, when);
		String title = context.getString(R.string.app_name);
		Intent notificationIntent = new Intent(context, CEPMobileManager.class);
		// set intent so it does not start a new activity
		notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
				| Intent.FLAG_ACTIVITY_SINGLE_TOP);
		PendingIntent intent = PendingIntent.getActivity(context, 0,
				notificationIntent, 0);
		notification.setLatestEventInfo(context, title, message, intent);
		notification.flags |= Notification.FLAG_AUTO_CANCEL;
		notificationManager.notify(0, notification);
	}

}
